#include <iostream>

// 懒汉式：对象在调用时进行构建  
// 饿汉式：程序在开始时就构建  
// 懒汉比饿汉更灵活

// 懒汉式 ：在第一次调用时创建，用完释放掉，可以重复使用
class Singleton
{
public:
    static Singleton *getinstance()  // 返回指向Singleton实例的指针
    {
        if(instance == nullptr)  // 懒汉式 实例在第一次请求时被创建 // 检查instance是否为空,如果为空，则创建一个新的实例   
        {
            instance = new Singleton;
        }
        return instance;   // 返回指向instance的指针
    }
    static void release()
    {
        delete instance;    // 用完将对象释放掉，下一次再用；  // 将之前创建的实例删除
        instance = nullptr;   // 将其设置为空，以便在下一次调用时可以直接创建
    }
private:
    Singleton(){}     // 构造函数声明为私有
    static Singleton *instance;   // 声明一个静态指针，指向类的唯一实例
};
Singleton *Singleton::instance = nullptr; // 在类外部定义并初始化 instance 静态成员变量

// 饿汉式
// class Singleton
// {
// public:
//     static Singleton *getinstance()
//     {
//         return instance;
//     }
// private:
//     Singleton(){}
//     static Singleton *instance;
// };
// Singleton *Singleton::instance = new Singleton;

// // 兼有懒汉与恶汉的特点，在第一次调用的时候创建，创建完对象之后卸不掉 
// class Singleton
// {
// public:
//     static Singleton *getinstance()
//     {
//         static Singleton instance;
//         return &instance;
//     }
// private:
//     Singleton(){}
// };

int main()
{
    aut obj = Singleton::getinstance();  // 懒汉式 第一次调用的时候才去构建

    
    return 0;
}
